package com.abigdreamer.im.server.module;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.abigdreamer.im.message.BaseMessage;
import com.abigdreamer.im.server.DB.dao.FriendGroupDao;
import com.abigdreamer.im.server.DB.dao.TeamDao;
import com.abigdreamer.im.server.DB.dao.UserDao;
import com.abigdreamer.im.server.log.EIMLogger;
import com.abigdreamer.im.server.module.vo.MsgFriendGroup;
import com.abigdreamer.im.server.module.vo.MsgTeam;
import com.abigdreamer.im.server.module.vo.MsgUser;

/**
 * 
 * 单例模式
 * 
 * 服务器的缓存组件，存放常用的数据。 1: 要解决的问题:如何制定数据的前置规制，守护及维护数据 2: 当数据量大的时候如何应对？ 3:
 * 系统刚刚开始使用的是模拟数据生成
 */
public class ServerCache {

	private static ServerCache instance;

	private UserDao userDao;
	private TeamDao teamDao;
	private FriendGroupDao friendGroupDao;

	private Map<String, UserConnect> userConnectMap; // 所有在线的用户的连接
	private Map<String, MsgUser> allUserMap; // 缓存的用户信息
	private Map<String, MsgUser> onLineUserMap; // 缓存在线的用户
	private List<MsgTeam> allTeamList; // 缓存群信息
	private List<MsgFriendGroup> allFriendGroupList; // 缓存好友组信息
	private Map<String, List<BaseMessage>> allLeaveMessageMap; // 缓存用户的留言信息
	private int leaveMessageList_MaxNum = 100; // 最大留言数目，多于这个数目就得采取办法

	private ServerCache() {
		this.initDao();
		this.initServerCache();
	}

	public static ServerCache getInstance() {
		if (instance == null) {
			EIMLogger.INFO("正在初始化服务器的缓存组件....");
			instance = new ServerCache();
		}
		return instance;
	}

	private void initDao() {
		userDao = new UserDao();
		teamDao = new TeamDao();
		friendGroupDao = new FriendGroupDao();
	}

	private void initServerCache() {
		this.initUserConnectMap();
		this.initAllUserMap();
		this.initOnLineUserMap();
		this.initAllTeamList();
		this.initAllFriendGroupList();
		this.initAllLeaveMessageMap();

	}

	/**
	 * 初始化用户连接缓存对象
	 */
	private void initUserConnectMap() {
		userConnectMap = new HashMap<String, UserConnect>();
		EIMLogger.INFO("服务器初始化用户连接缓存对象");
	}

	/**
	 * 初始化用户信息缓存对象
	 */
	private void initAllUserMap() {
		allUserMap = userDao.getAllUser();
		EIMLogger.INFO("初始化用户信息缓存对象");
	}

	/**
	 * 初始化在线用户信息缓存对象
	 */
	private void initOnLineUserMap() {
		onLineUserMap = new HashMap<String, MsgUser>();
		EIMLogger.INFO("初始化在线用户信息缓存对象");
	}

	/**
	 * 初始化群信息缓存对象
	 */
	private void initAllTeamList() {
		allTeamList = teamDao.getAllTeam();
		EIMLogger.INFO("初始化群信息缓存对象");
	}

	/**
	 * 初始化好友列表信息缓存对象
	 */
	private void initAllFriendGroupList() {
		allFriendGroupList = friendGroupDao.getAllFriendGroup();
		EIMLogger.INFO("初始化好友列表信息缓存对象");
	}

	/**
	 * 初始化留言信息列表
	 * 
	 * @return 留言信息列表
	 */
	private void initAllLeaveMessageMap() {
		allLeaveMessageMap = new HashMap<String, List<BaseMessage>>();
		EIMLogger.INFO("初始化留言信息列表");
	}

	/**
	 * 根据留言信息的所有者ID来提出他的留言列表
	 * 
	 * @param owerID
	 *            ： 留言信息所有者ID
	 * @return 留言信息列表
	 */
	public List<BaseMessage> getLeaveMessageListByOwerID(String owerID) {
		return allLeaveMessageMap.remove(owerID);
	}

	/**
	 * 将某个登入成功的用户添加到在线用户列表中
	 * 
	 * @param user
	 *            :成功登入的用户
	 */
	public void addUserToOnLineList(String owerID, MsgUser user) {
		onLineUserMap.put(owerID, user);
		EIMLogger.INFO(owerID + "登入成功！添加到在线用户列表中");
	}

	/**
	 * 将某个下线或掉线的用户移除在线用户列表中
	 * 
	 * @param user
	 *            ：下线的用户
	 */
	public void removeUserFromeOnlineList(String owerID) {
		onLineUserMap.remove(owerID);
		EIMLogger.INFO("移除在线" + owerID + "用户列表中");
	}

	/**
	 * 把某个用户的连接对象加入服务器的连接对象map
	 * 
	 * @param owerID
	 *            :此会话的用户者的QQ号
	 * @param userConnect
	 *            :此会话的用户连接对象
	 */
	public void addUserConnect(String owerID, UserConnect userConnect) {
		if (null == userConnectMap) {
			userConnectMap = new HashMap<String, UserConnect>();
		}
		userConnectMap.put(owerID, userConnect);
	}

	/**
	 * 把用户的连接对象移除服务器的连接对象map
	 * 
	 * @param owerID
	 *            :此会话的用户者的ID号
	 */
	public void removeUserConnect(String owerID) {
		userConnectMap.remove(owerID);
	}

	public Map<String, UserConnect> getUserConnectMap() {
		return userConnectMap;
	}

	public void setUserConnectMap(Map<String, UserConnect> userConnectMap) {
		this.userConnectMap = userConnectMap;
	}

	public Map<String, MsgUser> getAllUserMap() {
		return allUserMap;
	}

	public void setAllUserMap(Map<String, MsgUser> allUserMap) {
		this.allUserMap = allUserMap;
	}

	public Map<String, MsgUser> getOnLineUserMap() {
		return onLineUserMap;
	}

	public void setOnLineUserMap(Map<String, MsgUser> onLineUserMap) {
		this.onLineUserMap = onLineUserMap;
	}

	public List<MsgTeam> getAllTeamList() {
		return allTeamList;
	}

	public void setAllTeamList(List<MsgTeam> allTeamList) {
		this.allTeamList = allTeamList;
	}

	public List<MsgFriendGroup> getAllFriendGroupList() {
		return allFriendGroupList;
	}

	public void setAllFriendGroupList(List<MsgFriendGroup> allFriendGroupList) {
		this.allFriendGroupList = allFriendGroupList;
	}

	public Map<String, List<BaseMessage>> getAllLeaveMessageMap() {
		return allLeaveMessageMap;
	}

	public void setAllLeaveMessageMap(Map<String, List<BaseMessage>> allLeaveMessageMap) {
		this.allLeaveMessageMap = allLeaveMessageMap;
	}

	public int getLeaveMessageList_MaxNum() {
		return leaveMessageList_MaxNum;
	}

	public void setLeaveMessageList_MaxNum(int leaveMessageList_MaxNum) {
		this.leaveMessageList_MaxNum = leaveMessageList_MaxNum;
	}
}
